tsconfig path를 린트에 적용하기

tsconfig와 린트 삽질기

2024-01-11

블로그 개발 중 다음과 같이 상대경로로 가져오는 부분이 굉장히 지저분해지고 길어지는 경우가 있었다.

import * from '../../../../lib..'

별로 이쁘지도 않고, 지저분해 보여서 깔끔하게 하기 위해 절대 경로를 찾아 적용하기로 했다.

먼저, 다음과 같이 tsconfig을 수정했다. 이제 ./src로 시작하는 경로를 @/를 써서 읽을 수 있게 되었다.

{
  "compilerOptions": {
    "baseUrl": ".",
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./src/*"],
    }
  },
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    ".next/types/**/*.ts",
    "next-sitemap.config.js"
  ],
  "exclude": ["node_modules"]
}

그러나 문제가 하나 있었다. ./src의 경로는 @를 써서 원활하게 가져왔지만, 프로젝트 루트에 lib이라는 폴더가 있었고, lib이라는 폴더에서 무언가를 가져오기 위해서는 상대경로가 길어졌다.

import * from '../../../../lib..'

절대 경로로 가져오기 위해, tsconfig에 paths를 여러개 적용해보았다. 다음과 같이 수정하였다. 이제 루트폴더에서 바로 가져오는 것은 ~를 , src폴더에서 가져오는 것은 @를 사용하면 된다.

{
  "compilerOptions": {
    "baseUrl": ".",
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./src/*"],
      "~/*": ["./*"]
    }
  },
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    ".next/types/**/*.ts",
    "next-sitemap.config.js"
  ],
  "exclude": ["node_modules"]
}

그러나 린트단에서 에러가 발생했다. eslint에서 'import/no-unresolved' 옵션에서 에러가 발생했다.

마크다운 이미지

경로의 파일이 unresolved하는 일이 없도록 하는 옵션인 이다. 그래서 이름부터 import/no-unresolved다. 정확히는 import로 가져온 파일 혹은 모듈이 unresolved가 되지 않도록(no)하는 옵션이다.

해당 규칙을 off시킬 수도 있지만, 완벽한 해결책이 아닌 것 같아 더 찾아보았다.

tsconfig.json 파일과 ESLint 설정을 확인한 결과, 두 설정 사이에 경로 별칭(alias)가 일치하지 않았다. 나는 ESLint가 tsconfig.json의 경로 설정을 인식하길 원했지만, 추가적인 설정이 필요했다. ESLint 설정에 eslint-import-resolver-typescript 플러그인을 추가하면 EsLint가 tsconfig의 경로 별칭을 읽을 수 있다.

먼저 패키지를 설치하고 다음과 같이 린트 설정을 수정해 해결할 수 있었다.

 npm add -D eslint-import-resolver-typescript


  //eslint.json
  "parserOptions": {
    "project": "./tsconfig.json"
  },
  "settings": {
    "import/resolver": {
      "typescript": {}
    }
  },